import os
import sys

# 把当前文件所在文件夹的父文件夹路径加入到PYTHONPATH
sys.path.append(
    os.path.dirname(
        os.path.dirname(os.path.abspath(__file__))))

import pandas as pd
import numpy as np
from scipy.stats import skew, kurtosis

from common import SimpleLogger


logger = SimpleLogger('A/A.txt')
logger.start()

# 读取数据
df = pd.read_excel("handled/预处理.xlsx")

# 创建新列表示四类文物
df["文物分类"] = df["类型"] + df["表面风化"]  # 如 "高钾风化"、"铅钡无风化"

# 找出所有的成分列（排除非成分列）
non_chem_cols = ["文物采样点", "文物编号", "成分总和", "纹饰", "类型", "颜色", "表面风化", "文物分类"]
chem_cols = [col for col in df.columns if col not in non_chem_cols]

# 统计函数
def compute_stats(group):
    stats = pd.DataFrame(index=chem_cols)

    stats["均值"] = group[chem_cols].mean()
    stats["方差"] = group[chem_cols].var()
    stats["标准差"] = group[chem_cols].std()
    stats["变异系数"] = stats["标准差"] / stats["均值"]
    stats["偏度"] = group[chem_cols].skew()
    stats["峰度"] = group[chem_cols].kurt()
    return stats.drop(columns=["标准差"])

# 保存统计表
result = []
samples = []

for name, group in df.groupby("文物分类"):
    stat_df = compute_stats(group)
    # 先添加成分列
    stat_df["成分"] = stat_df.index
    stat_df["文物分类"] = name
    # 调整列顺序
    cols = ["成分"] + [col for col in stat_df.columns if col != "成分"]
    stat_df = stat_df[cols]
    result.append(stat_df.reset_index(drop=True))


# 合并统计结果和样本清单
stats_df = pd.concat(result, ignore_index=True)
# samples_df = pd.concat(samples, ignore_index=True)

# 获取需要格式化的数值列
numeric_cols = ["均值", "方差", "变异系数", "偏度", "峰度"]
# 对每个数值列应用四舍五入
for col in numeric_cols:
    if col in stats_df.columns:
        stats_df[col] = stats_df[col].round(3)

# 分别保存为4个xlsx文件
for category in stats_df["文物分类"].unique():
    sub_df = stats_df[stats_df["文物分类"] == category]
    output_path = f"handled/四类文物统计_{category}.xlsx"
    # 移除文物分类列，因为已经在文件名中体现
    sub_df = sub_df.drop(columns=["文物分类"])
    sub_df.to_excel(output_path, index=False)

print(f"已将统计结果保存至handled/目录下的四个xlsx文件")

# 画箱线图

import matplotlib.pyplot as plt
import seaborn as sns

# 读取统计结果（之前生成的四类文物统计.xlsx）
df = pd.read_excel("handled/四类文物统计.xlsx", sheet_name=None)

# 将每个 sheet 加上分类名合并为一个 DataFrame
all_data = []
for category, sheet_df in df.items():
    sheet_df["文物分类"] = category
    all_data.append(sheet_df)

merged_df = pd.concat(all_data, ignore_index=True)

# 筛选用于画图的列：文物分类、成分、均值
plot_df = merged_df[["文物分类", "成分", "均值"]]

# 设置画图风格
plt.figure(figsize=(14, 8))
sns.set_theme(style="whitegrid")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# # 使用 seaborn boxplot 做成分均值的分布图
# sns.boxplot(data=plot_df, x="成分", y="均值", hue="文物分类")

# plt.title("四类文物各成分均值分布（箱线图）", fontsize=16)
# plt.xticks(rotation=45)
# plt.tight_layout()
# plt.legend(title="文物分类")
# plt.grid(True)
# plt.savefig("handled/文物成分均值_箱线图.png", dpi=300)
# # plt.show()

plt.figure(figsize=(14, 8))
sns.barplot(data=plot_df, x="成分", y="均值", hue="文物分类", ci=None)

plt.title("四类文物各成分均值对比（柱状图）", fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.legend(title="文物分类")
plt.grid(True)

plt.savefig("A/文物成分均值_柱状图.png", dpi=300)
# # 保存
# stats_df.to_excel("handled/四类文物统计.xlsx", index=False)
# samples_df.to_excel("handled/四类文物样本清单.xlsx", index=False)

logger.stop()
